www.gusucode.com > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序 > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序/code/eiTab.cpp

    #include "stdafx.h"
#include "sql.h"
#include "sqlext.h"
#include "FTDB.h"
#include "eiTab.h"
#include "outputCon.h"
// Download by http://www.NewXing.com
CExpTab::CExpTab(CFTDB* pDB)
{
	m_pDB=pDB;
	m_fMonitorConsole=TRUE;
	m_pFileData2=m_pFileData=m_pFile=NULL;
	m_fWithTxtFile=FALSE;
	m_fWithHeader=TRUE;
}

CExpTab::~CExpTab()
{
}

BOOL CExpTab::ExportTab(LPCSTR pszExpSQL,LPCSTR pszFileName,LPCSTR pszImpSQL)
{
	HSTMT hstmt;
	RETCODE rt=SQLAllocStmt(m_pDB->m_hdbc,&hstmt);
	if(!SQL_SUCC(rt))
		return FALSE;
	SQLSetStmtOption(hstmt,SQL_CONCURRENCY,SQL_CONCUR_READ_ONLY);
	SQLSetStmtOption(hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_FORWARD_ONLY);
	BOOL fOK=FALSE;
	
	if(m_fMonitorConsole)
		startConsoleWin();
	if(OpenFile(pszFileName,m_fWithTxtFile))
	{
		WriteFileHead(pszExpSQL,pszImpSQL);
		fOK=ExportTab_2(hstmt,pszExpSQL);
		CloseFile();
	}
	if(m_fMonitorConsole)
		endConsoleWin();
	SQLFreeStmt(hstmt,SQL_DROP);
	return fOK;
}

BOOL CExpTab::ExportTab_2(HSTMT hstmt,LPCSTR pszSQL)
{//第二步
	RETCODE rt=SQLExecDirect(hstmt,(UCHAR*)pszSQL, SQL_NTS);
	if(!SQL_SUCCEEDED(rt))
	{
		m_pDB->DisplayError(hstmt);
		return FALSE;
	}
	SWORD swNum;
	rt=SQLNumResultCols(hstmt,&swNum);
	if(!SQL_SUCCEEDED(rt))
		return FALSE;
	SDWORD cbLen=1024*50;
	char *pszBuf=new char[cbLen];
	sprintf(pszBuf,"%d",(int)swNum);
	WriteFile("<Col>");
	WriteFile(pszBuf);
	WriteFile("</Col>");

	int iRecordNum=0;
	while(1)
	{
		rt= SQLFetch(hstmt); 
		if(!SQL_SUCCEEDED(rt))
		{
			delete pszBuf;
			if(SQL_NO_DATA_FOUND==rt)
			{
				if(m_fMonitorConsole)
					debugCon_wprintf("完成\n");
				char szOut[100];
				sprintf(szOut,"%d",iRecordNum);
				WriteFile("<Record>");
				WriteFile(szOut);
				WriteFile("</Record>");
				if(m_fMonitorConsole)
					debugCon_wprintf("成功导出数据 %d 条",iRecordNum);
				//AfxMessageBox(szOut);
				break;
			}
			else
			{
				if(m_fMonitorConsole)
					debugCon_wprintf("出现错误\n",iRecordNum);
				m_pDB->DisplayError(hstmt);
				return FALSE;
			}
		}
		iRecordNum++;
		if(m_fMonitorConsole)
			debugCon_wprintf("导出第 %d 条记录\n",iRecordNum);
		for(int i=0;i<(int)swNum;i++)
		{
			SDWORD cbRetLen;
			rt=SQLGetData(hstmt,i+1, SQL_C_CHAR, pszBuf, cbLen,&cbRetLen); 
			if(!SQL_SUCCEEDED(rt))
			{
				if(m_fMonitorConsole)
					debugCon_wprintf("出现错误\n");
				m_pDB->DisplayError(hstmt);
				delete pszBuf;
				return FALSE;
			}
			WriteFile(pszBuf,(DWORD)cbRetLen);
		}
	}
	return TRUE;
}

BOOL CExpTab::WriteFileHead(LPCSTR pszExpSQL,LPCSTR pszImpSQL)
{
	if(m_pFile)
	{
		WriteFile("<<HG DB FrontTool 0.1>>");
		WriteFile("<Exp>");
		WriteFile(pszExpSQL);
		WriteFile("</Exp>");
		WriteFile("<Imp>");
		WriteFile(pszImpSQL);
		WriteFile("</Imp>");
		WriteFile("<<Head End>>");
	}
	return TRUE;
}

BOOL CExpTab::WriteFile(LPCSTR pszTxt)
{
	if(m_pFile)
		fprintf(m_pFile,"%s\n",pszTxt);
	return TRUE;
}

BOOL CExpTab::WriteFile(LPVOID pData,DWORD dwLen)
{
	DWORD dwW=fwrite(&dwLen,sizeof(DWORD),1,m_pFileData);
	if(dwLen!=(DWORD)-1)
		dwW+=fwrite(pData,dwLen,1,m_pFileData);

	if(NULL==m_pFileData2)
		return dwW==dwLen;

	char szTxt[20];
	sprintf(szTxt,"%d",dwLen);
	fprintf(m_pFileData2,"%s->",szTxt);
	for(int i=0;i<(int)dwLen;i++)
	{
		fprintf(m_pFileData2,"%c",((char*)pData)[i]);
	}
	fprintf(m_pFileData2,"\n");

	return dwW==dwLen;
}

BOOL CExpTab::OpenFile(LPCSTR pszFN,BOOL fWithTxt)
{
	char szFN[300];
	sprintf(szFN,"%s.hdr",pszFN);
	
	ASSERT(m_fWithHeader);
	if(m_fWithHeader)
		m_pFile=fopen(szFN,"wt");
	else
		m_pFile=NULL;

	sprintf(szFN,"%s.exp",pszFN);
	m_pFileData=fopen(szFN,"wb");
	
	sprintf(szFN,"%s.txt",pszFN);
	if(fWithTxt)
		m_pFileData2=fopen(szFN,"wb");
	else
		m_pFileData2=NULL;
	if(!m_pFile || !m_pFileData)
	{
		CloseFile();
		return FALSE;
	}
	return TRUE;
}

BOOL CExpTab::CloseFile(void)
{
	if(m_pFile)
		fclose(m_pFile);
	if(m_pFileData)
		fclose(m_pFileData);
	if(m_pFileData2)
		fclose(m_pFileData2);
	return TRUE;
}

CImpTab::CImpTab(CFTDB* pDB)
{
	m_pDB=pDB;
	m_fMonitorConsole=TRUE;
	m_pFileData=m_pFile=NULL;
}

CImpTab::~CImpTab()
{
}

BOOL GetMiddleString(FILE* pF,LPCSTR pszH,LPCSTR pszT,CString &szBuf)
{
	char szRead[400];
	szBuf="";
	CString szTemp;
	int iPhase=0;
	while(NULL!=fgets(szRead,399,pF))
	{
		szTemp=szRead;
		switch(iPhase)
		{
		case(0):
			if(0==szTemp.Find(pszH))
				iPhase=1;
			break;
		case(1):
			if(0==szTemp.Find(pszT))
			{
				return TRUE;
			}
			szBuf+=szRead;
			szBuf+="\n";
			break;
		default:
			ASSERT(0);
			break;
		}
	}
	return FALSE;
}

BOOL CImpTab::AnalyHeader(LPCSTR pszFileName,int &iCol,int &iRow,CString& szImpSQL)
{
	FILE* pFile=fopen(pszFileName,"r");
	if(NULL==pFile)
		return FALSE;
	BOOL fOK1,fOK2,fOK3;
	CString szContent;
	fOK1=GetMiddleString(pFile,"<Imp>","</Imp>",szContent);
	szImpSQL=szContent;
	fOK2=GetMiddleString(pFile,"<Col>","</Col>",szContent);
	iCol=atoi(szContent);
	fOK3=GetMiddleString(pFile,"<Record>","</Record>",szContent);
	iRow=atoi(szContent);
	return fOK1&&fOK2&&fOK3;
}
		
BOOL CImpTab::ImportTab(LPCSTR pszSQL,LPCSTR pszFileName,int iCol,int iTotal)
{
	m_iCol=iCol;
	m_iTotalRecord=iTotal;
//	if(m_iCol==-1 || m_iTotal==-1)
//		ReadFileHead();
	HSTMT hstmt;
	RETCODE rt=SQLAllocStmt(m_pDB->m_hdbc,&hstmt);
	if(!SQL_SUCC(rt))
		return FALSE;
	BOOL fOK=FALSE;
	NewBuf();
	if(m_fMonitorConsole)
		startConsoleWin();
	if(OpenFile(pszFileName))
	{
		fOK=ImportTab_2(hstmt,pszSQL);
		CloseFile();
	}
	if(m_fMonitorConsole)
		endConsoleWin();
	SQLFreeStmt(hstmt,SQL_DROP);
	DelBuf();
	return fOK;
}

BOOL CImpTab::ImportTab_2(HSTMT hstmt,LPCSTR pszSQL)
{
	RETCODE rt = SQLPrepare(hstmt, (UCHAR*)pszSQL,SQL_NTS); 
	if (rt != SQL_SUCCESS)
	{
		m_pDB->DisplayError(hstmt);
		return FALSE;
	}
	SDWORD cbLen=SQL_NTS;
	for(int i=0;i<m_iCol;i++)
	{//添加参数
		char* pszBuf=(char*)m_arrPtrBuf.GetAt(i);
		rt=SQLBindParameter(hstmt, 
							i+1, 
							SQL_PARAM_INPUT, 
							SQL_C_CHAR, 
							SQL_CHAR, 
							1024*4, 
							0, 
							pszBuf, 
							0, 
							&cbLen); 
		if(!SQL_SUCC(rt))
		{
			if(m_fMonitorConsole)
				debugCon_wprintf("出现错误\n");
			m_pDB->DisplayError(hstmt);
			return FALSE;
		}
	}
	for(i=0;i<m_iTotalRecord;i++)
	{
		if(m_fMonitorConsole)
			debugCon_wprintf("导入数据第%d条\n",i+1);
		ReadRecord();
		rt= SQLExecute(hstmt);
		if(!SQL_SUCC(rt))
		{
			if(m_fMonitorConsole)
				debugCon_wprintf("出现错误\n");
			m_pDB->DisplayError(hstmt);
			return FALSE;
		}
	}
	if(m_fMonitorConsole)
		debugCon_wprintf("完成\n");
	return TRUE;
}

BOOL CImpTab::ReadFileHead(void)
{
	return FALSE;
}

BOOL CImpTab::ReadRecord(void)
{
	DWORD dwLen,dwRead;
	for(int i=0;i<m_iCol;i++)
	{
		char* pszBuf=(char*)m_arrPtrBuf.GetAt(i);
		dwRead=fread(&dwLen,sizeof(DWORD),1,m_pFileData);
		if(dwLen!=(DWORD)-1)
			dwRead+=fread(pszBuf,dwLen,1,m_pFileData);
		else
			dwLen=0;
		pszBuf[dwLen]='\0';
	}
	return (dwRead==dwLen+sizeof(DWORD));
}

BOOL CImpTab::NewBuf(void)
{
	for(int i=0;i<m_iCol;i++)
	{//bug
		char* pBuf=new char[1024*4];
		m_arrPtrBuf.Add(pBuf);
	}
	return TRUE;
}

BOOL CImpTab::DelBuf(void)
{
	for(int i=0;i<m_iCol;i++)
	{
		void* pBuf=m_arrPtrBuf.GetAt(0);
		m_arrPtrBuf.RemoveAt(0);
		delete pBuf;
	}
	return TRUE;
}

BOOL CImpTab::OpenFile(LPCSTR pszFileName)
{
	char szFN[300];
	sprintf(szFN,"%s.hdr",pszFileName);
	m_pFile=fopen(szFN,"rt");

	sprintf(szFN,"%s.exp",pszFileName);
	m_pFileData=fopen(szFN,"rb");
	if(!m_pFile || !m_pFileData)
	{
		CloseFile();
		return FALSE;
	}
	return TRUE;
}

BOOL CImpTab::CloseFile(void)
{
	if(m_pFile)
		fclose(m_pFile);
	if(m_pFileData)
		fclose(m_pFileData);
	return TRUE;
}